package tabla_de_simbolos;


import java.util.*;
import generador_de_codigo.GeneradorDeCodigo;
import java.io.IOException;
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

/**
 *
 * @author Javi & Seba
 */
public class TablaDeSimbolos {
    private HashMap<String, Clase> listaClases;
    private Clase claseActual;
    private Constructor metodoActual;
    private String definiendo;

    public TablaDeSimbolos() {
        listaClases = new HashMap();
    } 
    
    public void chequeoDeclaraciones() throws ErrorSemantico, IOException{
        boolean main = false;
        GeneradorDeCodigo.generar(".DATA \n");
        for (Map.Entry<String, Clase> entry : listaClases.entrySet()) { //por cada clase
            Clase clase = entry.getValue();            
            if(!clase.getNombre().equals("Object") && !clase.getNombre().equals("System")){
                
                if(!clase.isCompleta())
                    clase.chequeoDeclaraciones();
            }
            
            
            if(clase.getTablaMetodos().containsKey("main")){
                if(clase.getTablaMetodos().get("main").getModMetodo().getModificador().equals("static") && clase.getTablaMetodos().get("main").getParametros().isEmpty())
                
                    main = true;
            }
           //ChequeoClasesDefinidas();
            
        } 
        if(!main){
            throw new ErrorSemantico("No existe ninguna clase con el metodo main");
        }     
        
        
        
    }  
    
    public void chequeoSentencias() throws ErrorSemantico, IOException {
        for (Map.Entry<String, Clase> entry : listaClases.entrySet()) { //por cada clase
            Clase clase = entry.getValue();            
            
            if(!clase.getNombre().equals("Object") && !clase.getNombre().equals("System")){
                        clase.chequeoSentencias();
            }
        }
    }

    public String getDefiniendo() {
        return definiendo;
    }

    public void setDefiniendo(String definiendo) {
        this.definiendo = definiendo;
    }
    
    public HashMap<String, Clase> getListaClases() {
        return listaClases;
    }

    public void setClaseActual(Clase claseActual) {
        this.claseActual = claseActual;
    }

    public void setMetodoActual(Constructor metodoActual) {
        this.metodoActual = metodoActual;
    }

    public Clase getClaseActual() {
        return claseActual;
    }

    public Constructor getMetodoActual() {
        return metodoActual;
    }

    
   
}
